{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# A training example in Pytorch\n",
    "## Introduction\n",
    "### Task\n",
    "In this notebook we will train a neural network to do a simple task. This will be a classification task : as explained in the first week of lectures, classification basically means to find a *decision boundary* over a space of real numbers. For representation purposes we will work with a 2D example : the decision boundary will be a cercle. More precisely, it will be the unit circle in the plan.\n",
    "![](unitycircle.png)\n",
    "### Sampling\n",
    "We will generate points $(x_1,x_2)$ to classify, and their class $y$. The actual decision fonction is $y=1_{x_1^2+x_2^2<1}$.\n",
    "\n",
    "To have a balanced dataset with about as many points in each class, we will sample uniformly over polar coordinates,  within the circle of center 0 and radius 2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sample_points(n):\n",
    "    # returns (X,Y), where X of shape (n,2) is the numpy array of points and Y is the (n) array of classes\n",
    "    \n",
    "    radius = np.random.uniform(low=0,high=2,size=n).reshape(-1,1) # uniform radius between 0 and 2\n",
    "    angle = np.random.uniform(low=0,high=2*np.pi,size=n).reshape(-1,1) # uniform angle\n",
    "    x1 = radius*np.cos(angle)\n",
    "    x2=radius*np.sin(angle)\n",
    "    y = (radius<1).astype(int).reshape(-1)\n",
    "    x = np.concatenate([x1,x2],axis=1)\n",
    "    return x,y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 2) (10000,)\n"
     ]
    }
   ],
   "source": [
    "# Generate the data\n",
    "trainx,trainy = sample_points(10000)\n",
    "valx,valy = sample_points(500)\n",
    "testx,testy = sample_points(500)\n",
    "\n",
    "print(trainx.shape,trainy.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our model will be a multi-layer perceptron with one hidden layer, and an output of size 2 since we have two classes. Since it is a binary classification task we could also use just one output and a zero threshold, but we will use two to illustrate the use of the pytorch Cross-Entropy loss (with one output, you would use BinaryCrossEntropy).\n",
    "\n",
    "As you know from the lectures, such a model cannot represent a circular boundary but could represent a polygonal boundary, whose number of sides is the number of neurons on the hidden layer. For example, with 6 hidden neurons the model could compute a hexagonal boundary that approximate the unity circle, such as :\n",
    "![](hexagon.png)\n",
    "\n",
    "Of course the trained model won't compute an actual hexagone, due to the activation that isn't a threshold, and the liberty of the final layer's weights (it does not have to be an AND). We can actually expect *better* accuracy than what a hexagon could do."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_single_hidden_MLP(n_hidden_neurons):\n",
    "    return nn.Sequential(nn.Linear(2,n_hidden_neurons),nn.ReLU(),nn.Linear(n_hidden_neurons,2))\n",
    "model1 = generate_single_hidden_MLP(6)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To train our model, we will need to feed it with tensors. Let's transform our generated numpy arrays :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.FloatTensor torch.LongTensor\n"
     ]
    }
   ],
   "source": [
    "trainx = torch.from_numpy(trainx).float()\n",
    "valx = torch.from_numpy(valx).float()\n",
    "testx = torch.from_numpy(testx).float()\n",
    "trainy = torch.from_numpy(trainy)\n",
    "valy = torch.from_numpy(valy)\n",
    "testy = torch.from_numpy(testy)\n",
    "print(trainx.type(),trainy.type())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we will define our training routine. There is the question of whether to perform our traing on CPU or GPU. The best thing to do is to use a flag variable that you will set, when you actually do the training."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "def training_routine(net,dataset,n_iters,gpu):\n",
    "    # organize the data\n",
    "    train_data,train_labels,val_data,val_labels = dataset\n",
    "    \n",
    "    criterion = nn.CrossEntropyLoss()\n",
    "    optimizer = torch.optim.SGD(net.parameters(),lr=0.01)\n",
    "    \n",
    "    # use the flag\n",
    "    if gpu:\n",
    "        train_data,train_labels = train_data.cuda(),train_labels.cuda()\n",
    "        val_data,val_labels = val_data.cuda(),val_labels.cuda()\n",
    "        net = net.cuda() # the network parameters also need to be on the gpu !\n",
    "        print(\"Using GPU\")\n",
    "    else:\n",
    "        print(\"Using CPU\")\n",
    "    for i in range(n_iters):\n",
    "        # forward pass\n",
    "        train_output = net(train_data)\n",
    "        train_loss = criterion(train_output,train_labels)\n",
    "        # backward pass and optimization\n",
    "        train_loss.backward()\n",
    "        optimizer.step()\n",
    "        optimizer.zero_grad()\n",
    "        \n",
    "        # Once every 100 iterations, print statistics\n",
    "        if i%100==0:\n",
    "            print(\"At iteration\",i)\n",
    "            # compute the accuracy of the prediction\n",
    "            train_prediction = train_output.cpu().detach().argmax(dim=1)\n",
    "            train_accuracy = (train_prediction.numpy()==train_labels.numpy()).mean() \n",
    "            # Now for the validation set\n",
    "            val_output = net(val_data)\n",
    "            val_loss = criterion(val_output,val_labels)\n",
    "            # compute the accuracy of the prediction\n",
    "            val_prediction = val_output.cpu().detach().argmax(dim=1)\n",
    "            val_accuracy = (val_prediction.numpy()==val_labels.numpy()).mean() \n",
    "            print(\"Training loss :\",train_loss.cpu().detach().numpy())\n",
    "            print(\"Training accuracy :\",train_accuracy)\n",
    "            print(\"Validation loss :\",val_loss.cpu().detach().numpy())\n",
    "            print(\"Validation accuracy :\",val_accuracy)\n",
    "    \n",
    "    net = net.cpu()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset = trainx,trainy,valx,valy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using CPU\n",
      "At iteration 0\n",
      "Training loss : 0.7094736099243164\n",
      "Training accuracy : 0.4997\n",
      "Validation loss : 0.7025020122528076\n",
      "Validation accuracy : 0.524\n",
      "At iteration 100\n",
      "Training loss : 0.6924378275871277\n",
      "Training accuracy : 0.4692\n",
      "Validation loss : 0.689512312412262\n",
      "Validation accuracy : 0.488\n",
      "At iteration 200\n",
      "Training loss : 0.6808919310569763\n",
      "Training accuracy : 0.4212\n",
      "Validation loss : 0.6802194714546204\n",
      "Validation accuracy : 0.438\n",
      "At iteration 300\n",
      "Training loss : 0.6705961227416992\n",
      "Training accuracy : 0.4035\n",
      "Validation loss : 0.6713734865188599\n",
      "Validation accuracy : 0.416\n",
      "At iteration 400\n",
      "Training loss : 0.6606850028038025\n",
      "Training accuracy : 0.4703\n",
      "Validation loss : 0.6625954508781433\n",
      "Validation accuracy : 0.462\n",
      "At iteration 500\n",
      "Training loss : 0.651013970375061\n",
      "Training accuracy : 0.6005\n",
      "Validation loss : 0.653831958770752\n",
      "Validation accuracy : 0.6\n",
      "At iteration 600\n",
      "Training loss : 0.6415998935699463\n",
      "Training accuracy : 0.6504\n",
      "Validation loss : 0.6451891660690308\n",
      "Validation accuracy : 0.646\n",
      "At iteration 700\n",
      "Training loss : 0.6324348449707031\n",
      "Training accuracy : 0.6758\n",
      "Validation loss : 0.6367149949073792\n",
      "Validation accuracy : 0.674\n",
      "At iteration 800\n",
      "Training loss : 0.6234920620918274\n",
      "Training accuracy : 0.6895\n",
      "Validation loss : 0.6283746361732483\n",
      "Validation accuracy : 0.702\n",
      "At iteration 900\n",
      "Training loss : 0.6147249341011047\n",
      "Training accuracy : 0.6999\n",
      "Validation loss : 0.6200445890426636\n",
      "Validation accuracy : 0.714\n",
      "At iteration 1000\n",
      "Training loss : 0.6059975028038025\n",
      "Training accuracy : 0.7079\n",
      "Validation loss : 0.611684262752533\n",
      "Validation accuracy : 0.72\n",
      "At iteration 1100\n",
      "Training loss : 0.5971628427505493\n",
      "Training accuracy : 0.7134\n",
      "Validation loss : 0.603006899356842\n",
      "Validation accuracy : 0.726\n",
      "At iteration 1200\n",
      "Training loss : 0.5881451964378357\n",
      "Training accuracy : 0.7203\n",
      "Validation loss : 0.5939261317253113\n",
      "Validation accuracy : 0.726\n",
      "At iteration 1300\n",
      "Training loss : 0.5788910388946533\n",
      "Training accuracy : 0.7245\n",
      "Validation loss : 0.5842557549476624\n",
      "Validation accuracy : 0.734\n",
      "At iteration 1400\n",
      "Training loss : 0.5694952607154846\n",
      "Training accuracy : 0.7303\n",
      "Validation loss : 0.5742834210395813\n",
      "Validation accuracy : 0.734\n",
      "At iteration 1500\n",
      "Training loss : 0.5600698590278625\n",
      "Training accuracy : 0.7362\n",
      "Validation loss : 0.5639551281929016\n",
      "Validation accuracy : 0.738\n",
      "At iteration 1600\n",
      "Training loss : 0.5506876707077026\n",
      "Training accuracy : 0.7441\n",
      "Validation loss : 0.5536485314369202\n",
      "Validation accuracy : 0.744\n",
      "At iteration 1700\n",
      "Training loss : 0.5415005087852478\n",
      "Training accuracy : 0.7504\n",
      "Validation loss : 0.5437160134315491\n",
      "Validation accuracy : 0.75\n",
      "At iteration 1800\n",
      "Training loss : 0.5327048897743225\n",
      "Training accuracy : 0.7558\n",
      "Validation loss : 0.5342254042625427\n",
      "Validation accuracy : 0.75\n",
      "At iteration 1900\n",
      "Training loss : 0.5243927240371704\n",
      "Training accuracy : 0.7612\n",
      "Validation loss : 0.52512526512146\n",
      "Validation accuracy : 0.756\n",
      "At iteration 2000\n",
      "Training loss : 0.516667902469635\n",
      "Training accuracy : 0.7657\n",
      "Validation loss : 0.5165843367576599\n",
      "Validation accuracy : 0.764\n",
      "At iteration 2100\n",
      "Training loss : 0.5093486309051514\n",
      "Training accuracy : 0.7716\n",
      "Validation loss : 0.5085561275482178\n",
      "Validation accuracy : 0.77\n",
      "At iteration 2200\n",
      "Training loss : 0.5023011565208435\n",
      "Training accuracy : 0.7776\n",
      "Validation loss : 0.5007575154304504\n",
      "Validation accuracy : 0.77\n",
      "At iteration 2300\n",
      "Training loss : 0.4955267608165741\n",
      "Training accuracy : 0.7826\n",
      "Validation loss : 0.4933590590953827\n",
      "Validation accuracy : 0.774\n",
      "At iteration 2400\n",
      "Training loss : 0.48888471722602844\n",
      "Training accuracy : 0.7868\n",
      "Validation loss : 0.4860289394855499\n",
      "Validation accuracy : 0.776\n",
      "At iteration 2500\n",
      "Training loss : 0.4821639060974121\n",
      "Training accuracy : 0.7884\n",
      "Validation loss : 0.4785388708114624\n",
      "Validation accuracy : 0.778\n",
      "At iteration 2600\n",
      "Training loss : 0.4751819968223572\n",
      "Training accuracy : 0.7905\n",
      "Validation loss : 0.4708109200000763\n",
      "Validation accuracy : 0.784\n",
      "At iteration 2700\n",
      "Training loss : 0.46764156222343445\n",
      "Training accuracy : 0.7935\n",
      "Validation loss : 0.4625591039657593\n",
      "Validation accuracy : 0.782\n",
      "At iteration 2800\n",
      "Training loss : 0.45939305424690247\n",
      "Training accuracy : 0.7953\n",
      "Validation loss : 0.453500360250473\n",
      "Validation accuracy : 0.784\n",
      "At iteration 2900\n",
      "Training loss : 0.45019903779029846\n",
      "Training accuracy : 0.799\n",
      "Validation loss : 0.44344761967658997\n",
      "Validation accuracy : 0.79\n",
      "At iteration 3000\n",
      "Training loss : 0.4399031698703766\n",
      "Training accuracy : 0.8035\n",
      "Validation loss : 0.4322035312652588\n",
      "Validation accuracy : 0.796\n",
      "At iteration 3100\n",
      "Training loss : 0.4283714294433594\n",
      "Training accuracy : 0.8081\n",
      "Validation loss : 0.41972842812538147\n",
      "Validation accuracy : 0.802\n",
      "At iteration 3200\n",
      "Training loss : 0.4155867099761963\n",
      "Training accuracy : 0.8123\n",
      "Validation loss : 0.4060231149196625\n",
      "Validation accuracy : 0.81\n",
      "At iteration 3300\n",
      "Training loss : 0.4017692506313324\n",
      "Training accuracy : 0.8193\n",
      "Validation loss : 0.39132747054100037\n",
      "Validation accuracy : 0.828\n",
      "At iteration 3400\n",
      "Training loss : 0.3872375190258026\n",
      "Training accuracy : 0.8384\n",
      "Validation loss : 0.3761199712753296\n",
      "Validation accuracy : 0.85\n",
      "At iteration 3500\n",
      "Training loss : 0.37237635254859924\n",
      "Training accuracy : 0.8606\n",
      "Validation loss : 0.36079293489456177\n",
      "Validation accuracy : 0.876\n",
      "At iteration 3600\n",
      "Training loss : 0.35758230090141296\n",
      "Training accuracy : 0.8794\n",
      "Validation loss : 0.34575703740119934\n",
      "Validation accuracy : 0.896\n",
      "At iteration 3700\n",
      "Training loss : 0.3431903123855591\n",
      "Training accuracy : 0.8938\n",
      "Validation loss : 0.3313218355178833\n",
      "Validation accuracy : 0.922\n",
      "At iteration 3800\n",
      "Training loss : 0.32950538396835327\n",
      "Training accuracy : 0.9058\n",
      "Validation loss : 0.31762298941612244\n",
      "Validation accuracy : 0.928\n",
      "At iteration 3900\n",
      "Training loss : 0.3166326582431793\n",
      "Training accuracy : 0.9172\n",
      "Validation loss : 0.30471599102020264\n",
      "Validation accuracy : 0.934\n",
      "At iteration 4000\n",
      "Training loss : 0.3046930134296417\n",
      "Training accuracy : 0.9259\n",
      "Validation loss : 0.2927299439907074\n",
      "Validation accuracy : 0.942\n",
      "At iteration 4100\n",
      "Training loss : 0.29362764954566956\n",
      "Training accuracy : 0.9314\n",
      "Validation loss : 0.2817845940589905\n",
      "Validation accuracy : 0.944\n",
      "At iteration 4200\n",
      "Training loss : 0.283450186252594\n",
      "Training accuracy : 0.9351\n",
      "Validation loss : 0.2718777060508728\n",
      "Validation accuracy : 0.946\n",
      "At iteration 4300\n",
      "Training loss : 0.2741493582725525\n",
      "Training accuracy : 0.9387\n",
      "Validation loss : 0.2628708481788635\n",
      "Validation accuracy : 0.946\n",
      "At iteration 4400\n",
      "Training loss : 0.26560747623443604\n",
      "Training accuracy : 0.9417\n",
      "Validation loss : 0.25456637144088745\n",
      "Validation accuracy : 0.946\n",
      "At iteration 4500\n",
      "Training loss : 0.257753849029541\n",
      "Training accuracy : 0.9445\n",
      "Validation loss : 0.24689248204231262\n",
      "Validation accuracy : 0.948\n",
      "At iteration 4600\n",
      "Training loss : 0.250512957572937\n",
      "Training accuracy : 0.9471\n",
      "Validation loss : 0.23986759781837463\n",
      "Validation accuracy : 0.948\n",
      "At iteration 4700\n",
      "Training loss : 0.2438523918390274\n",
      "Training accuracy : 0.9494\n",
      "Validation loss : 0.2334265261888504\n",
      "Validation accuracy : 0.948\n",
      "At iteration 4800\n",
      "Training loss : 0.2377067357301712\n",
      "Training accuracy : 0.9502\n",
      "Validation loss : 0.22752909362316132\n",
      "Validation accuracy : 0.95\n",
      "At iteration 4900\n",
      "Training loss : 0.2320215404033661\n",
      "Training accuracy : 0.9518\n",
      "Validation loss : 0.2220955193042755\n",
      "Validation accuracy : 0.952\n",
      "At iteration 5000\n",
      "Training loss : 0.22674360871315002\n",
      "Training accuracy : 0.9531\n",
      "Validation loss : 0.21709506213665009\n",
      "Validation accuracy : 0.952\n",
      "At iteration 5100\n",
      "Training loss : 0.22184191644191742\n",
      "Training accuracy : 0.9548\n",
      "Validation loss : 0.21243484318256378\n",
      "Validation accuracy : 0.956\n",
      "At iteration 5200\n",
      "Training loss : 0.21727551519870758\n",
      "Training accuracy : 0.9558\n",
      "Validation loss : 0.20807476341724396\n",
      "Validation accuracy : 0.956\n",
      "At iteration 5300\n",
      "Training loss : 0.2130155712366104\n",
      "Training accuracy : 0.9565\n",
      "Validation loss : 0.20402328670024872\n",
      "Validation accuracy : 0.958\n",
      "At iteration 5400\n",
      "Training loss : 0.2090359330177307\n",
      "Training accuracy : 0.9575\n",
      "Validation loss : 0.20025363564491272\n",
      "Validation accuracy : 0.96\n",
      "At iteration 5500\n",
      "Training loss : 0.2053021788597107\n",
      "Training accuracy : 0.9579\n",
      "Validation loss : 0.19673214852809906\n",
      "Validation accuracy : 0.962\n",
      "At iteration 5600\n",
      "Training loss : 0.20180094242095947\n",
      "Training accuracy : 0.9585\n",
      "Validation loss : 0.19342291355133057\n",
      "Validation accuracy : 0.958\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "At iteration 5700\n",
      "Training loss : 0.19849926233291626\n",
      "Training accuracy : 0.9586\n",
      "Validation loss : 0.1902962327003479\n",
      "Validation accuracy : 0.958\n",
      "At iteration 5800\n",
      "Training loss : 0.1953829824924469\n",
      "Training accuracy : 0.9582\n",
      "Validation loss : 0.1873455047607422\n",
      "Validation accuracy : 0.958\n",
      "At iteration 5900\n",
      "Training loss : 0.19244320690631866\n",
      "Training accuracy : 0.9583\n",
      "Validation loss : 0.1845509558916092\n",
      "Validation accuracy : 0.96\n",
      "At iteration 6000\n",
      "Training loss : 0.18965516984462738\n",
      "Training accuracy : 0.9579\n",
      "Validation loss : 0.18190455436706543\n",
      "Validation accuracy : 0.962\n",
      "At iteration 6100\n",
      "Training loss : 0.1870163381099701\n",
      "Training accuracy : 0.9579\n",
      "Validation loss : 0.1793961375951767\n",
      "Validation accuracy : 0.962\n",
      "At iteration 6200\n",
      "Training loss : 0.1845097839832306\n",
      "Training accuracy : 0.9574\n",
      "Validation loss : 0.17701087892055511\n",
      "Validation accuracy : 0.96\n",
      "At iteration 6300\n",
      "Training loss : 0.18212391436100006\n",
      "Training accuracy : 0.9573\n",
      "Validation loss : 0.17473553121089935\n",
      "Validation accuracy : 0.96\n",
      "At iteration 6400\n",
      "Training loss : 0.1798512041568756\n",
      "Training accuracy : 0.9575\n",
      "Validation loss : 0.17256943881511688\n",
      "Validation accuracy : 0.96\n",
      "At iteration 6500\n",
      "Training loss : 0.17767655849456787\n",
      "Training accuracy : 0.9578\n",
      "Validation loss : 0.17050345242023468\n",
      "Validation accuracy : 0.96\n",
      "At iteration 6600\n",
      "Training loss : 0.17560601234436035\n",
      "Training accuracy : 0.9577\n",
      "Validation loss : 0.16853420436382294\n",
      "Validation accuracy : 0.96\n",
      "At iteration 6700\n",
      "Training loss : 0.17362672090530396\n",
      "Training accuracy : 0.9577\n",
      "Validation loss : 0.16665448248386383\n",
      "Validation accuracy : 0.96\n",
      "At iteration 6800\n",
      "Training loss : 0.17173264920711517\n",
      "Training accuracy : 0.9579\n",
      "Validation loss : 0.16485506296157837\n",
      "Validation accuracy : 0.96\n",
      "At iteration 6900\n",
      "Training loss : 0.16991502046585083\n",
      "Training accuracy : 0.9579\n",
      "Validation loss : 0.1631305068731308\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7000\n",
      "Training loss : 0.16817165911197662\n",
      "Training accuracy : 0.958\n",
      "Validation loss : 0.16147397458553314\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7100\n",
      "Training loss : 0.1664978265762329\n",
      "Training accuracy : 0.9581\n",
      "Validation loss : 0.15988218784332275\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7200\n",
      "Training loss : 0.16488929092884064\n",
      "Training accuracy : 0.9581\n",
      "Validation loss : 0.15835466980934143\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7300\n",
      "Training loss : 0.1633434146642685\n",
      "Training accuracy : 0.9582\n",
      "Validation loss : 0.1568891853094101\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7400\n",
      "Training loss : 0.16185139119625092\n",
      "Training accuracy : 0.9581\n",
      "Validation loss : 0.15546871721744537\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7500\n",
      "Training loss : 0.16041773557662964\n",
      "Training accuracy : 0.9582\n",
      "Validation loss : 0.15410001575946808\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7600\n",
      "Training loss : 0.159030020236969\n",
      "Training accuracy : 0.9583\n",
      "Validation loss : 0.15278419852256775\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7700\n",
      "Training loss : 0.15769675374031067\n",
      "Training accuracy : 0.9585\n",
      "Validation loss : 0.1515134572982788\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7800\n",
      "Training loss : 0.15640464425086975\n",
      "Training accuracy : 0.9584\n",
      "Validation loss : 0.15028473734855652\n",
      "Validation accuracy : 0.96\n",
      "At iteration 7900\n",
      "Training loss : 0.15515576303005219\n",
      "Training accuracy : 0.9588\n",
      "Validation loss : 0.1490970104932785\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8000\n",
      "Training loss : 0.15395034849643707\n",
      "Training accuracy : 0.9588\n",
      "Validation loss : 0.1479550004005432\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8100\n",
      "Training loss : 0.15278492867946625\n",
      "Training accuracy : 0.9589\n",
      "Validation loss : 0.14685584604740143\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8200\n",
      "Training loss : 0.15165551006793976\n",
      "Training accuracy : 0.9589\n",
      "Validation loss : 0.1457960158586502\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8300\n",
      "Training loss : 0.15056194365024567\n",
      "Training accuracy : 0.9589\n",
      "Validation loss : 0.14476731419563293\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8400\n",
      "Training loss : 0.14950017631053925\n",
      "Training accuracy : 0.9589\n",
      "Validation loss : 0.14377078413963318\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8500\n",
      "Training loss : 0.14846988022327423\n",
      "Training accuracy : 0.9589\n",
      "Validation loss : 0.1428040862083435\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8600\n",
      "Training loss : 0.14747203886508942\n",
      "Training accuracy : 0.9589\n",
      "Validation loss : 0.14186589419841766\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8700\n",
      "Training loss : 0.14649862051010132\n",
      "Training accuracy : 0.9591\n",
      "Validation loss : 0.14095601439476013\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8800\n",
      "Training loss : 0.14555610716342926\n",
      "Training accuracy : 0.9595\n",
      "Validation loss : 0.14007297158241272\n",
      "Validation accuracy : 0.96\n",
      "At iteration 8900\n",
      "Training loss : 0.14464214444160461\n",
      "Training accuracy : 0.9598\n",
      "Validation loss : 0.13921520113945007\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9000\n",
      "Training loss : 0.14375051856040955\n",
      "Training accuracy : 0.9599\n",
      "Validation loss : 0.13838347792625427\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9100\n",
      "Training loss : 0.14288130402565002\n",
      "Training accuracy : 0.9599\n",
      "Validation loss : 0.13757547736167908\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9200\n",
      "Training loss : 0.14203906059265137\n",
      "Training accuracy : 0.9598\n",
      "Validation loss : 0.1367889642715454\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9300\n",
      "Training loss : 0.1412191540002823\n",
      "Training accuracy : 0.9599\n",
      "Validation loss : 0.13602197170257568\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9400\n",
      "Training loss : 0.14041586220264435\n",
      "Training accuracy : 0.9599\n",
      "Validation loss : 0.13527227938175201\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9500\n",
      "Training loss : 0.13963380455970764\n",
      "Training accuracy : 0.96\n",
      "Validation loss : 0.1345418393611908\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9600\n",
      "Training loss : 0.1388712227344513\n",
      "Training accuracy : 0.9602\n",
      "Validation loss : 0.13382989168167114\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9700\n",
      "Training loss : 0.13812445104122162\n",
      "Training accuracy : 0.9602\n",
      "Validation loss : 0.1331353336572647\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9800\n",
      "Training loss : 0.1373959332704544\n",
      "Training accuracy : 0.9601\n",
      "Validation loss : 0.1324591040611267\n",
      "Validation accuracy : 0.96\n",
      "At iteration 9900\n",
      "Training loss : 0.1366870105266571\n",
      "Training accuracy : 0.9603\n",
      "Validation loss : 0.1317979246377945\n",
      "Validation accuracy : 0.96\n"
     ]
    }
   ],
   "source": [
    "gpu = False\n",
    "gpu = gpu and torch.cuda.is_available() # to know if you actually can use the GPU\n",
    "begin = time.time()\n",
    "training_routine(model1,dataset,10000,gpu)\n",
    "end=time.time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training time : 13.61394453048706\n"
     ]
    }
   ],
   "source": [
    "print(\"Training time :\",end-begin)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using CPU\n",
      "At iteration 0\n",
      "Training loss : 0.7721424102783203\n",
      "Training accuracy : 0.5003\n",
      "Validation loss : 0.7745897173881531\n",
      "Validation accuracy : 0.476\n",
      "At iteration 100\n",
      "Training loss : 0.7194032669067383\n",
      "Training accuracy : 0.5177\n",
      "Validation loss : 0.7196709513664246\n",
      "Validation accuracy : 0.502\n",
      "At iteration 200\n",
      "Training loss : 0.6952459216117859\n",
      "Training accuracy : 0.6279\n",
      "Validation loss : 0.6937494874000549\n",
      "Validation accuracy : 0.606\n",
      "At iteration 300\n",
      "Training loss : 0.6812130808830261\n",
      "Training accuracy : 0.6313\n",
      "Validation loss : 0.6784570217132568\n",
      "Validation accuracy : 0.618\n",
      "At iteration 400\n",
      "Training loss : 0.6708069443702698\n",
      "Training accuracy : 0.622\n",
      "Validation loss : 0.6670488119125366\n",
      "Validation accuracy : 0.642\n",
      "At iteration 500\n",
      "Training loss : 0.6614969372749329\n",
      "Training accuracy : 0.62\n",
      "Validation loss : 0.657058596611023\n",
      "Validation accuracy : 0.634\n",
      "At iteration 600\n",
      "Training loss : 0.6524924039840698\n",
      "Training accuracy : 0.6617\n",
      "Validation loss : 0.647628128528595\n",
      "Validation accuracy : 0.682\n",
      "At iteration 700\n",
      "Training loss : 0.6435213685035706\n",
      "Training accuracy : 0.722\n",
      "Validation loss : 0.6384636759757996\n",
      "Validation accuracy : 0.736\n",
      "At iteration 800\n",
      "Training loss : 0.6343700885772705\n",
      "Training accuracy : 0.7448\n",
      "Validation loss : 0.629283607006073\n",
      "Validation accuracy : 0.746\n",
      "At iteration 900\n",
      "Training loss : 0.6249431371688843\n",
      "Training accuracy : 0.7507\n",
      "Validation loss : 0.6200006008148193\n",
      "Validation accuracy : 0.758\n",
      "At iteration 1000\n",
      "Training loss : 0.6151807904243469\n",
      "Training accuracy : 0.7542\n",
      "Validation loss : 0.6105427145957947\n",
      "Validation accuracy : 0.762\n",
      "At iteration 1100\n",
      "Training loss : 0.6050592660903931\n",
      "Training accuracy : 0.7571\n",
      "Validation loss : 0.6008710265159607\n",
      "Validation accuracy : 0.758\n",
      "At iteration 1200\n",
      "Training loss : 0.5945945382118225\n",
      "Training accuracy : 0.7589\n",
      "Validation loss : 0.5910001993179321\n",
      "Validation accuracy : 0.754\n",
      "At iteration 1300\n",
      "Training loss : 0.5838586091995239\n",
      "Training accuracy : 0.7616\n",
      "Validation loss : 0.5809494256973267\n",
      "Validation accuracy : 0.758\n",
      "At iteration 1400\n",
      "Training loss : 0.572958767414093\n",
      "Training accuracy : 0.7652\n",
      "Validation loss : 0.5708028674125671\n",
      "Validation accuracy : 0.762\n",
      "At iteration 1500\n",
      "Training loss : 0.5619840621948242\n",
      "Training accuracy : 0.769\n",
      "Validation loss : 0.5606495141983032\n",
      "Validation accuracy : 0.766\n",
      "At iteration 1600\n",
      "Training loss : 0.5510643720626831\n",
      "Training accuracy : 0.7742\n",
      "Validation loss : 0.5505988001823425\n",
      "Validation accuracy : 0.772\n",
      "At iteration 1700\n",
      "Training loss : 0.5403259992599487\n",
      "Training accuracy : 0.7791\n",
      "Validation loss : 0.5407440662384033\n",
      "Validation accuracy : 0.774\n",
      "At iteration 1800\n",
      "Training loss : 0.5298816561698914\n",
      "Training accuracy : 0.7854\n",
      "Validation loss : 0.5311303734779358\n",
      "Validation accuracy : 0.782\n",
      "At iteration 1900\n",
      "Training loss : 0.5198320150375366\n",
      "Training accuracy : 0.7901\n",
      "Validation loss : 0.5219102501869202\n",
      "Validation accuracy : 0.784\n",
      "At iteration 2000\n",
      "Training loss : 0.5102008581161499\n",
      "Training accuracy : 0.794\n",
      "Validation loss : 0.5131376385688782\n",
      "Validation accuracy : 0.79\n",
      "At iteration 2100\n",
      "Training loss : 0.5010112524032593\n",
      "Training accuracy : 0.7974\n",
      "Validation loss : 0.5048238635063171\n",
      "Validation accuracy : 0.792\n",
      "At iteration 2200\n",
      "Training loss : 0.49227529764175415\n",
      "Training accuracy : 0.7977\n",
      "Validation loss : 0.4969383180141449\n",
      "Validation accuracy : 0.788\n",
      "At iteration 2300\n",
      "Training loss : 0.48399701714515686\n",
      "Training accuracy : 0.7982\n",
      "Validation loss : 0.48947909474372864\n",
      "Validation accuracy : 0.792\n",
      "At iteration 2400\n",
      "Training loss : 0.4761584997177124\n",
      "Training accuracy : 0.7984\n",
      "Validation loss : 0.482432097196579\n",
      "Validation accuracy : 0.788\n",
      "At iteration 2500\n",
      "Training loss : 0.46871617436408997\n",
      "Training accuracy : 0.8002\n",
      "Validation loss : 0.47575610876083374\n",
      "Validation accuracy : 0.788\n",
      "At iteration 2600\n",
      "Training loss : 0.46163374185562134\n",
      "Training accuracy : 0.7998\n",
      "Validation loss : 0.46941113471984863\n",
      "Validation accuracy : 0.788\n",
      "At iteration 2700\n",
      "Training loss : 0.4548700153827667\n",
      "Training accuracy : 0.8003\n",
      "Validation loss : 0.4633523225784302\n",
      "Validation accuracy : 0.784\n",
      "At iteration 2800\n",
      "Training loss : 0.4483754336833954\n",
      "Training accuracy : 0.802\n",
      "Validation loss : 0.4574962556362152\n",
      "Validation accuracy : 0.786\n",
      "At iteration 2900\n",
      "Training loss : 0.4421015977859497\n",
      "Training accuracy : 0.803\n",
      "Validation loss : 0.45179644227027893\n",
      "Validation accuracy : 0.784\n",
      "At iteration 3000\n",
      "Training loss : 0.4360049366950989\n",
      "Training accuracy : 0.8033\n",
      "Validation loss : 0.4462225139141083\n",
      "Validation accuracy : 0.784\n",
      "At iteration 3100\n",
      "Training loss : 0.4300267994403839\n",
      "Training accuracy : 0.8043\n",
      "Validation loss : 0.44075262546539307\n",
      "Validation accuracy : 0.784\n",
      "At iteration 3200\n",
      "Training loss : 0.4241281747817993\n",
      "Training accuracy : 0.8056\n",
      "Validation loss : 0.43531617522239685\n",
      "Validation accuracy : 0.784\n",
      "At iteration 3300\n",
      "Training loss : 0.4182828664779663\n",
      "Training accuracy : 0.8064\n",
      "Validation loss : 0.429708868265152\n",
      "Validation accuracy : 0.784\n",
      "At iteration 3400\n",
      "Training loss : 0.41243964433670044\n",
      "Training accuracy : 0.8076\n",
      "Validation loss : 0.42400258779525757\n",
      "Validation accuracy : 0.784\n",
      "At iteration 3500\n",
      "Training loss : 0.40656036138534546\n",
      "Training accuracy : 0.8085\n",
      "Validation loss : 0.4182460904121399\n",
      "Validation accuracy : 0.788\n",
      "At iteration 3600\n",
      "Training loss : 0.400637686252594\n",
      "Training accuracy : 0.8106\n",
      "Validation loss : 0.4123477339744568\n",
      "Validation accuracy : 0.788\n",
      "At iteration 3700\n",
      "Training loss : 0.3946937620639801\n",
      "Training accuracy : 0.8121\n",
      "Validation loss : 0.4062924087047577\n",
      "Validation accuracy : 0.794\n",
      "At iteration 3800\n",
      "Training loss : 0.3886962831020355\n",
      "Training accuracy : 0.812\n",
      "Validation loss : 0.3999313712120056\n",
      "Validation accuracy : 0.794\n",
      "At iteration 3900\n",
      "Training loss : 0.38264012336730957\n",
      "Training accuracy : 0.8142\n",
      "Validation loss : 0.3934798538684845\n",
      "Validation accuracy : 0.796\n",
      "At iteration 4000\n",
      "Training loss : 0.3765116035938263\n",
      "Training accuracy : 0.8145\n",
      "Validation loss : 0.3870420455932617\n",
      "Validation accuracy : 0.804\n",
      "At iteration 4100\n",
      "Training loss : 0.37026485800743103\n",
      "Training accuracy : 0.8162\n",
      "Validation loss : 0.38049426674842834\n",
      "Validation accuracy : 0.804\n",
      "At iteration 4200\n",
      "Training loss : 0.3638828694820404\n",
      "Training accuracy : 0.8176\n",
      "Validation loss : 0.37374505400657654\n",
      "Validation accuracy : 0.804\n",
      "At iteration 4300\n",
      "Training loss : 0.3574095368385315\n",
      "Training accuracy : 0.8194\n",
      "Validation loss : 0.36693036556243896\n",
      "Validation accuracy : 0.808\n",
      "At iteration 4400\n",
      "Training loss : 0.35086214542388916\n",
      "Training accuracy : 0.8214\n",
      "Validation loss : 0.36010292172431946\n",
      "Validation accuracy : 0.812\n",
      "At iteration 4500\n",
      "Training loss : 0.34429922699928284\n",
      "Training accuracy : 0.8217\n",
      "Validation loss : 0.35326969623565674\n",
      "Validation accuracy : 0.82\n",
      "At iteration 4600\n",
      "Training loss : 0.3377928137779236\n",
      "Training accuracy : 0.8228\n",
      "Validation loss : 0.3465498387813568\n",
      "Validation accuracy : 0.822\n",
      "At iteration 4700\n",
      "Training loss : 0.3313407897949219\n",
      "Training accuracy : 0.8233\n",
      "Validation loss : 0.33987462520599365\n",
      "Validation accuracy : 0.824\n",
      "At iteration 4800\n",
      "Training loss : 0.32490742206573486\n",
      "Training accuracy : 0.8249\n",
      "Validation loss : 0.3332517445087433\n",
      "Validation accuracy : 0.822\n",
      "At iteration 4900\n",
      "Training loss : 0.3185511529445648\n",
      "Training accuracy : 0.8268\n",
      "Validation loss : 0.32657161355018616\n",
      "Validation accuracy : 0.824\n",
      "At iteration 5000\n",
      "Training loss : 0.312311589717865\n",
      "Training accuracy : 0.8278\n",
      "Validation loss : 0.3199158310890198\n",
      "Validation accuracy : 0.818\n",
      "At iteration 5100\n",
      "Training loss : 0.3061591386795044\n",
      "Training accuracy : 0.8288\n",
      "Validation loss : 0.3134167790412903\n",
      "Validation accuracy : 0.816\n",
      "At iteration 5200\n",
      "Training loss : 0.3000841438770294\n",
      "Training accuracy : 0.8298\n",
      "Validation loss : 0.3070879578590393\n",
      "Validation accuracy : 0.82\n",
      "At iteration 5300\n",
      "Training loss : 0.29402846097946167\n",
      "Training accuracy : 0.8318\n",
      "Validation loss : 0.30080926418304443\n",
      "Validation accuracy : 0.818\n",
      "At iteration 5400\n",
      "Training loss : 0.2880176603794098\n",
      "Training accuracy : 0.8998\n",
      "Validation loss : 0.29451754689216614\n",
      "Validation accuracy : 0.882\n",
      "At iteration 5500\n",
      "Training loss : 0.28211575746536255\n",
      "Training accuracy : 0.904\n",
      "Validation loss : 0.28820833563804626\n",
      "Validation accuracy : 0.888\n",
      "At iteration 5600\n",
      "Training loss : 0.2764001786708832\n",
      "Training accuracy : 0.9085\n",
      "Validation loss : 0.2819250822067261\n",
      "Validation accuracy : 0.892\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "At iteration 5700\n",
      "Training loss : 0.27083608508110046\n",
      "Training accuracy : 0.9122\n",
      "Validation loss : 0.27582883834838867\n",
      "Validation accuracy : 0.9\n",
      "At iteration 5800\n",
      "Training loss : 0.26541319489479065\n",
      "Training accuracy : 0.9146\n",
      "Validation loss : 0.26992836594581604\n",
      "Validation accuracy : 0.906\n",
      "At iteration 5900\n",
      "Training loss : 0.2601531147956848\n",
      "Training accuracy : 0.9188\n",
      "Validation loss : 0.264261394739151\n",
      "Validation accuracy : 0.91\n",
      "At iteration 6000\n",
      "Training loss : 0.2550504505634308\n",
      "Training accuracy : 0.9231\n",
      "Validation loss : 0.2588290274143219\n",
      "Validation accuracy : 0.912\n",
      "At iteration 6100\n",
      "Training loss : 0.25010165572166443\n",
      "Training accuracy : 0.9266\n",
      "Validation loss : 0.2535479664802551\n",
      "Validation accuracy : 0.916\n",
      "At iteration 6200\n",
      "Training loss : 0.24530282616615295\n",
      "Training accuracy : 0.9299\n",
      "Validation loss : 0.2485044151544571\n",
      "Validation accuracy : 0.918\n",
      "At iteration 6300\n",
      "Training loss : 0.24065327644348145\n",
      "Training accuracy : 0.9329\n",
      "Validation loss : 0.24360352754592896\n",
      "Validation accuracy : 0.926\n",
      "At iteration 6400\n",
      "Training loss : 0.23620635271072388\n",
      "Training accuracy : 0.9353\n",
      "Validation loss : 0.2389111965894699\n",
      "Validation accuracy : 0.932\n",
      "At iteration 6500\n",
      "Training loss : 0.23192843794822693\n",
      "Training accuracy : 0.9373\n",
      "Validation loss : 0.23437607288360596\n",
      "Validation accuracy : 0.934\n",
      "At iteration 6600\n",
      "Training loss : 0.2278127670288086\n",
      "Training accuracy : 0.9386\n",
      "Validation loss : 0.2299935519695282\n",
      "Validation accuracy : 0.936\n",
      "At iteration 6700\n",
      "Training loss : 0.22382226586341858\n",
      "Training accuracy : 0.9407\n",
      "Validation loss : 0.2258264422416687\n",
      "Validation accuracy : 0.936\n",
      "At iteration 6800\n",
      "Training loss : 0.2199774831533432\n",
      "Training accuracy : 0.942\n",
      "Validation loss : 0.22186389565467834\n",
      "Validation accuracy : 0.938\n",
      "At iteration 6900\n",
      "Training loss : 0.21630403399467468\n",
      "Training accuracy : 0.9445\n",
      "Validation loss : 0.21811813116073608\n",
      "Validation accuracy : 0.94\n",
      "At iteration 7000\n",
      "Training loss : 0.21277348697185516\n",
      "Training accuracy : 0.9463\n",
      "Validation loss : 0.21449914574623108\n",
      "Validation accuracy : 0.94\n",
      "At iteration 7100\n",
      "Training loss : 0.2093857228755951\n",
      "Training accuracy : 0.9487\n",
      "Validation loss : 0.21099260449409485\n",
      "Validation accuracy : 0.94\n",
      "At iteration 7200\n",
      "Training loss : 0.20613595843315125\n",
      "Training accuracy : 0.9506\n",
      "Validation loss : 0.20765165984630585\n",
      "Validation accuracy : 0.942\n",
      "At iteration 7300\n",
      "Training loss : 0.2030266672372818\n",
      "Training accuracy : 0.9517\n",
      "Validation loss : 0.20446918904781342\n",
      "Validation accuracy : 0.94\n",
      "At iteration 7400\n",
      "Training loss : 0.20004282891750336\n",
      "Training accuracy : 0.9518\n",
      "Validation loss : 0.2014136016368866\n",
      "Validation accuracy : 0.936\n",
      "At iteration 7500\n",
      "Training loss : 0.19718578457832336\n",
      "Training accuracy : 0.9524\n",
      "Validation loss : 0.19850434362888336\n",
      "Validation accuracy : 0.936\n",
      "At iteration 7600\n",
      "Training loss : 0.1944422721862793\n",
      "Training accuracy : 0.9535\n",
      "Validation loss : 0.1957242488861084\n",
      "Validation accuracy : 0.938\n",
      "At iteration 7700\n",
      "Training loss : 0.1917954534292221\n",
      "Training accuracy : 0.9542\n",
      "Validation loss : 0.19306592643260956\n",
      "Validation accuracy : 0.938\n",
      "At iteration 7800\n",
      "Training loss : 0.18923763930797577\n",
      "Training accuracy : 0.9547\n",
      "Validation loss : 0.19052310287952423\n",
      "Validation accuracy : 0.94\n",
      "At iteration 7900\n",
      "Training loss : 0.18676848709583282\n",
      "Training accuracy : 0.9556\n",
      "Validation loss : 0.1880779266357422\n",
      "Validation accuracy : 0.94\n",
      "At iteration 8000\n",
      "Training loss : 0.18439412117004395\n",
      "Training accuracy : 0.9555\n",
      "Validation loss : 0.1857403814792633\n",
      "Validation accuracy : 0.942\n",
      "At iteration 8100\n",
      "Training loss : 0.18210233747959137\n",
      "Training accuracy : 0.9559\n",
      "Validation loss : 0.183505117893219\n",
      "Validation accuracy : 0.942\n",
      "At iteration 8200\n",
      "Training loss : 0.17990881204605103\n",
      "Training accuracy : 0.9562\n",
      "Validation loss : 0.18134142458438873\n",
      "Validation accuracy : 0.942\n",
      "At iteration 8300\n",
      "Training loss : 0.17779052257537842\n",
      "Training accuracy : 0.9563\n",
      "Validation loss : 0.17925222218036652\n",
      "Validation accuracy : 0.94\n",
      "At iteration 8400\n",
      "Training loss : 0.17574496567249298\n",
      "Training accuracy : 0.9568\n",
      "Validation loss : 0.17724712193012238\n",
      "Validation accuracy : 0.94\n",
      "At iteration 8500\n",
      "Training loss : 0.17377956211566925\n",
      "Training accuracy : 0.9566\n",
      "Validation loss : 0.1752931773662567\n",
      "Validation accuracy : 0.94\n",
      "At iteration 8600\n",
      "Training loss : 0.17189037799835205\n",
      "Training accuracy : 0.9566\n",
      "Validation loss : 0.17339494824409485\n",
      "Validation accuracy : 0.944\n",
      "At iteration 8700\n",
      "Training loss : 0.1700710505247116\n",
      "Training accuracy : 0.9567\n",
      "Validation loss : 0.1715780645608902\n",
      "Validation accuracy : 0.946\n",
      "At iteration 8800\n",
      "Training loss : 0.16831479966640472\n",
      "Training accuracy : 0.9567\n",
      "Validation loss : 0.16981984674930573\n",
      "Validation accuracy : 0.946\n",
      "At iteration 8900\n",
      "Training loss : 0.16661638021469116\n",
      "Training accuracy : 0.957\n",
      "Validation loss : 0.16812482476234436\n",
      "Validation accuracy : 0.944\n",
      "At iteration 9000\n",
      "Training loss : 0.1649736762046814\n",
      "Training accuracy : 0.9569\n",
      "Validation loss : 0.16649149358272552\n",
      "Validation accuracy : 0.944\n",
      "At iteration 9100\n",
      "Training loss : 0.16338884830474854\n",
      "Training accuracy : 0.9572\n",
      "Validation loss : 0.1649193912744522\n",
      "Validation accuracy : 0.944\n",
      "At iteration 9200\n",
      "Training loss : 0.16185453534126282\n",
      "Training accuracy : 0.9571\n",
      "Validation loss : 0.16340723633766174\n",
      "Validation accuracy : 0.944\n",
      "At iteration 9300\n",
      "Training loss : 0.16037563979625702\n",
      "Training accuracy : 0.9572\n",
      "Validation loss : 0.1619318127632141\n",
      "Validation accuracy : 0.944\n",
      "At iteration 9400\n",
      "Training loss : 0.15894010663032532\n",
      "Training accuracy : 0.9572\n",
      "Validation loss : 0.16050885617733002\n",
      "Validation accuracy : 0.944\n",
      "At iteration 9500\n",
      "Training loss : 0.1575559377670288\n",
      "Training accuracy : 0.9576\n",
      "Validation loss : 0.1591341495513916\n",
      "Validation accuracy : 0.944\n",
      "At iteration 9600\n",
      "Training loss : 0.15621374547481537\n",
      "Training accuracy : 0.9581\n",
      "Validation loss : 0.1578087955713272\n",
      "Validation accuracy : 0.944\n",
      "At iteration 9700\n",
      "Training loss : 0.15491421520709991\n",
      "Training accuracy : 0.958\n",
      "Validation loss : 0.15652917325496674\n",
      "Validation accuracy : 0.946\n",
      "At iteration 9800\n",
      "Training loss : 0.15365515649318695\n",
      "Training accuracy : 0.9577\n",
      "Validation loss : 0.15528994798660278\n",
      "Validation accuracy : 0.944\n",
      "At iteration 9900\n",
      "Training loss : 0.15243449807167053\n",
      "Training accuracy : 0.9574\n",
      "Validation loss : 0.15409091114997864\n",
      "Validation accuracy : 0.944\n"
     ]
    }
   ],
   "source": [
    "# Let's try with 3 hidden neurons.\n",
    "model2 = generate_single_hidden_MLP(3) \n",
    "training_routine(model2,dataset,10000,gpu)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(393, 2) (107, 2)\n"
     ]
    }
   ],
   "source": [
    "out = model2(testx).argmax(dim=1).detach().numpy()\n",
    "green = testx.numpy()[np.where(out==1)]\n",
    "red = testx.numpy()[np.where(out==0)]\n",
    "print(green.shape,red.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "def print_model(model,datapoints):\n",
    "    out = model(datapoints).argmax(dim=1).detach().numpy()\n",
    "    green = datapoints.numpy()[np.where(out==1)]\n",
    "    red = datapoints.numpy()[np.where(out==0)]\n",
    "\n",
    "    circle1 = plt.Circle((0, 0), 1, color='y')\n",
    "    circle2 = plt.Circle((0, 0), 1, color='b',fill=False)\n",
    "\n",
    "    fig, ax = plt.subplots() # note we must use plt.subplots, not plt.subplot\n",
    "    # (or if you have an existing figure)\n",
    "    # fig = plt.gcf()\n",
    "    # ax = fig.gca()\n",
    "    plt.xlim((-2,2))\n",
    "    plt.ylim((-2,2))\n",
    "\n",
    "    pos_values = plt.scatter(x=green[:,0],y=green[:,1], color='g',)\n",
    "    neg_values = plt.scatter(x=red[:,0],y=red[:,1], color='r',)\n",
    "\n",
    "    ax.add_artist(circle1)\n",
    "    ax.add_artist(circle2)\n",
    "    ax.add_artist(pos_values)\n",
    "    ax.add_artist(neg_values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print_model(model1,testx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print_model(model2,testx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using CPU\n",
      "At iteration 0\n",
      "Training loss : 0.7322251796722412\n",
      "Training accuracy : 0.5003\n",
      "Validation loss : 0.7439041137695312\n",
      "Validation accuracy : 0.476\n",
      "At iteration 100\n",
      "Training loss : 0.692024827003479\n",
      "Training accuracy : 0.5003\n",
      "Validation loss : 0.6968146562576294\n",
      "Validation accuracy : 0.476\n",
      "At iteration 200\n",
      "Training loss : 0.6811820268630981\n",
      "Training accuracy : 0.6407\n",
      "Validation loss : 0.6828126907348633\n",
      "Validation accuracy : 0.64\n",
      "At iteration 300\n",
      "Training loss : 0.6767441630363464\n",
      "Training accuracy : 0.6155\n",
      "Validation loss : 0.6768767833709717\n",
      "Validation accuracy : 0.612\n",
      "At iteration 400\n",
      "Training loss : 0.6735808849334717\n",
      "Training accuracy : 0.5918\n",
      "Validation loss : 0.6729535460472107\n",
      "Validation accuracy : 0.576\n",
      "At iteration 500\n",
      "Training loss : 0.6706365346908569\n",
      "Training accuracy : 0.5869\n",
      "Validation loss : 0.6695631146430969\n",
      "Validation accuracy : 0.566\n",
      "At iteration 600\n",
      "Training loss : 0.6676961779594421\n",
      "Training accuracy : 0.5872\n",
      "Validation loss : 0.6663118600845337\n",
      "Validation accuracy : 0.566\n",
      "At iteration 700\n",
      "Training loss : 0.6646400690078735\n",
      "Training accuracy : 0.5889\n",
      "Validation loss : 0.663058340549469\n",
      "Validation accuracy : 0.57\n",
      "At iteration 800\n",
      "Training loss : 0.6615479588508606\n",
      "Training accuracy : 0.592\n",
      "Validation loss : 0.6597669720649719\n",
      "Validation accuracy : 0.572\n",
      "At iteration 900\n",
      "Training loss : 0.6584209203720093\n",
      "Training accuracy : 0.5962\n",
      "Validation loss : 0.6564382314682007\n",
      "Validation accuracy : 0.576\n",
      "At iteration 1000\n",
      "Training loss : 0.655292272567749\n",
      "Training accuracy : 0.6001\n",
      "Validation loss : 0.6531014442443848\n",
      "Validation accuracy : 0.588\n",
      "At iteration 1100\n",
      "Training loss : 0.6522042751312256\n",
      "Training accuracy : 0.6031\n",
      "Validation loss : 0.6497678756713867\n",
      "Validation accuracy : 0.588\n",
      "At iteration 1200\n",
      "Training loss : 0.6491259932518005\n",
      "Training accuracy : 0.6062\n",
      "Validation loss : 0.6464691758155823\n",
      "Validation accuracy : 0.592\n",
      "At iteration 1300\n",
      "Training loss : 0.646142303943634\n",
      "Training accuracy : 0.6105\n",
      "Validation loss : 0.6432306170463562\n",
      "Validation accuracy : 0.598\n",
      "At iteration 1400\n",
      "Training loss : 0.6432123780250549\n",
      "Training accuracy : 0.6138\n",
      "Validation loss : 0.6400620937347412\n",
      "Validation accuracy : 0.608\n",
      "At iteration 1500\n",
      "Training loss : 0.6403558850288391\n",
      "Training accuracy : 0.6153\n",
      "Validation loss : 0.6369459629058838\n",
      "Validation accuracy : 0.614\n",
      "At iteration 1600\n",
      "Training loss : 0.6375930905342102\n",
      "Training accuracy : 0.6171\n",
      "Validation loss : 0.6338757872581482\n",
      "Validation accuracy : 0.614\n",
      "At iteration 1700\n",
      "Training loss : 0.6348770260810852\n",
      "Training accuracy : 0.6181\n",
      "Validation loss : 0.6308420896530151\n",
      "Validation accuracy : 0.618\n",
      "At iteration 1800\n",
      "Training loss : 0.6322138905525208\n",
      "Training accuracy : 0.6201\n",
      "Validation loss : 0.627816915512085\n",
      "Validation accuracy : 0.618\n",
      "At iteration 1900\n",
      "Training loss : 0.6295547485351562\n",
      "Training accuracy : 0.6214\n",
      "Validation loss : 0.6247938275337219\n",
      "Validation accuracy : 0.62\n",
      "At iteration 2000\n",
      "Training loss : 0.6268810629844666\n",
      "Training accuracy : 0.6225\n",
      "Validation loss : 0.6217261552810669\n",
      "Validation accuracy : 0.624\n",
      "At iteration 2100\n",
      "Training loss : 0.624137282371521\n",
      "Training accuracy : 0.6234\n",
      "Validation loss : 0.6185603141784668\n",
      "Validation accuracy : 0.622\n",
      "At iteration 2200\n",
      "Training loss : 0.6213068962097168\n",
      "Training accuracy : 0.6249\n",
      "Validation loss : 0.6152701377868652\n",
      "Validation accuracy : 0.628\n",
      "At iteration 2300\n",
      "Training loss : 0.6183569431304932\n",
      "Training accuracy : 0.6264\n",
      "Validation loss : 0.6118085384368896\n",
      "Validation accuracy : 0.632\n",
      "At iteration 2400\n",
      "Training loss : 0.6152074337005615\n",
      "Training accuracy : 0.6275\n",
      "Validation loss : 0.6081345081329346\n",
      "Validation accuracy : 0.634\n",
      "At iteration 2500\n",
      "Training loss : 0.6118346452713013\n",
      "Training accuracy : 0.6273\n",
      "Validation loss : 0.6042084097862244\n",
      "Validation accuracy : 0.636\n",
      "At iteration 2600\n",
      "Training loss : 0.6081463098526001\n",
      "Training accuracy : 0.6291\n",
      "Validation loss : 0.5999860763549805\n",
      "Validation accuracy : 0.634\n",
      "At iteration 2700\n",
      "Training loss : 0.6041485667228699\n",
      "Training accuracy : 0.6299\n",
      "Validation loss : 0.5954444408416748\n",
      "Validation accuracy : 0.64\n",
      "At iteration 2800\n",
      "Training loss : 0.599783182144165\n",
      "Training accuracy : 0.631\n",
      "Validation loss : 0.5905480980873108\n",
      "Validation accuracy : 0.642\n",
      "At iteration 2900\n",
      "Training loss : 0.5951037406921387\n",
      "Training accuracy : 0.6328\n",
      "Validation loss : 0.5853073000907898\n",
      "Validation accuracy : 0.642\n",
      "At iteration 3000\n",
      "Training loss : 0.5901716947555542\n",
      "Training accuracy : 0.6347\n",
      "Validation loss : 0.5797579884529114\n",
      "Validation accuracy : 0.646\n",
      "At iteration 3100\n",
      "Training loss : 0.5850412845611572\n",
      "Training accuracy : 0.6347\n",
      "Validation loss : 0.5740054845809937\n",
      "Validation accuracy : 0.644\n",
      "At iteration 3200\n",
      "Training loss : 0.5798712372779846\n",
      "Training accuracy : 0.6359\n",
      "Validation loss : 0.5681529641151428\n",
      "Validation accuracy : 0.642\n",
      "At iteration 3300\n",
      "Training loss : 0.5748031139373779\n",
      "Training accuracy : 0.6351\n",
      "Validation loss : 0.5623536109924316\n",
      "Validation accuracy : 0.642\n",
      "At iteration 3400\n",
      "Training loss : 0.5698748230934143\n",
      "Training accuracy : 0.6359\n",
      "Validation loss : 0.5566360950469971\n",
      "Validation accuracy : 0.644\n",
      "At iteration 3500\n",
      "Training loss : 0.5650386810302734\n",
      "Training accuracy : 0.7386\n",
      "Validation loss : 0.550993800163269\n",
      "Validation accuracy : 0.756\n",
      "At iteration 3600\n",
      "Training loss : 0.5603278875350952\n",
      "Training accuracy : 0.7461\n",
      "Validation loss : 0.5454593896865845\n",
      "Validation accuracy : 0.766\n",
      "At iteration 3700\n",
      "Training loss : 0.5557198524475098\n",
      "Training accuracy : 0.7532\n",
      "Validation loss : 0.5400413274765015\n",
      "Validation accuracy : 0.778\n",
      "At iteration 3800\n",
      "Training loss : 0.55121248960495\n",
      "Training accuracy : 0.7613\n",
      "Validation loss : 0.5347303748130798\n",
      "Validation accuracy : 0.784\n",
      "At iteration 3900\n",
      "Training loss : 0.5468212962150574\n",
      "Training accuracy : 0.7677\n",
      "Validation loss : 0.5295364856719971\n",
      "Validation accuracy : 0.79\n",
      "At iteration 4000\n",
      "Training loss : 0.5425290465354919\n",
      "Training accuracy : 0.7723\n",
      "Validation loss : 0.5244505405426025\n",
      "Validation accuracy : 0.788\n",
      "At iteration 4100\n",
      "Training loss : 0.5383680462837219\n",
      "Training accuracy : 0.7748\n",
      "Validation loss : 0.5194881558418274\n",
      "Validation accuracy : 0.786\n",
      "At iteration 4200\n",
      "Training loss : 0.5343233942985535\n",
      "Training accuracy : 0.7772\n",
      "Validation loss : 0.514661967754364\n",
      "Validation accuracy : 0.786\n",
      "At iteration 4300\n",
      "Training loss : 0.53041011095047\n",
      "Training accuracy : 0.7789\n",
      "Validation loss : 0.50998854637146\n",
      "Validation accuracy : 0.788\n",
      "At iteration 4400\n",
      "Training loss : 0.5266469717025757\n",
      "Training accuracy : 0.7792\n",
      "Validation loss : 0.5054762959480286\n",
      "Validation accuracy : 0.788\n",
      "At iteration 4500\n",
      "Training loss : 0.5230193138122559\n",
      "Training accuracy : 0.7807\n",
      "Validation loss : 0.5011327862739563\n",
      "Validation accuracy : 0.79\n",
      "At iteration 4600\n",
      "Training loss : 0.5195500254631042\n",
      "Training accuracy : 0.7804\n",
      "Validation loss : 0.49694713950157166\n",
      "Validation accuracy : 0.792\n",
      "At iteration 4700\n",
      "Training loss : 0.5162141919136047\n",
      "Training accuracy : 0.7811\n",
      "Validation loss : 0.4929443597793579\n",
      "Validation accuracy : 0.79\n",
      "At iteration 4800\n",
      "Training loss : 0.5130330324172974\n",
      "Training accuracy : 0.7818\n",
      "Validation loss : 0.4891165792942047\n",
      "Validation accuracy : 0.792\n",
      "At iteration 4900\n",
      "Training loss : 0.5099995732307434\n",
      "Training accuracy : 0.7815\n",
      "Validation loss : 0.4854678809642792\n",
      "Validation accuracy : 0.792\n",
      "At iteration 5000\n",
      "Training loss : 0.5071061849594116\n",
      "Training accuracy : 0.7828\n",
      "Validation loss : 0.4820062816143036\n",
      "Validation accuracy : 0.794\n",
      "At iteration 5100\n",
      "Training loss : 0.5043449401855469\n",
      "Training accuracy : 0.7836\n",
      "Validation loss : 0.47874289751052856\n",
      "Validation accuracy : 0.796\n",
      "At iteration 5200\n",
      "Training loss : 0.5017210245132446\n",
      "Training accuracy : 0.7828\n",
      "Validation loss : 0.475636750459671\n",
      "Validation accuracy : 0.796\n",
      "At iteration 5300\n",
      "Training loss : 0.49923402070999146\n",
      "Training accuracy : 0.7827\n",
      "Validation loss : 0.4726700484752655\n",
      "Validation accuracy : 0.798\n",
      "At iteration 5400\n",
      "Training loss : 0.4968907833099365\n",
      "Training accuracy : 0.7828\n",
      "Validation loss : 0.4698328375816345\n",
      "Validation accuracy : 0.798\n",
      "At iteration 5500\n",
      "Training loss : 0.4946672320365906\n",
      "Training accuracy : 0.7824\n",
      "Validation loss : 0.4671729803085327\n",
      "Validation accuracy : 0.796\n",
      "At iteration 5600\n",
      "Training loss : 0.4925578534603119\n",
      "Training accuracy : 0.7818\n",
      "Validation loss : 0.46470120549201965\n",
      "Validation accuracy : 0.8\n",
      "At iteration 5700\n",
      "Training loss : 0.4905661642551422\n",
      "Training accuracy : 0.7819\n",
      "Validation loss : 0.46235981583595276\n",
      "Validation accuracy : 0.8\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "At iteration 5800\n",
      "Training loss : 0.4886975586414337\n",
      "Training accuracy : 0.7822\n",
      "Validation loss : 0.4601275622844696\n",
      "Validation accuracy : 0.8\n",
      "At iteration 5900\n",
      "Training loss : 0.4869404435157776\n",
      "Training accuracy : 0.7818\n",
      "Validation loss : 0.4580116868019104\n",
      "Validation accuracy : 0.8\n",
      "At iteration 6000\n",
      "Training loss : 0.4852849245071411\n",
      "Training accuracy : 0.7811\n",
      "Validation loss : 0.4560043513774872\n",
      "Validation accuracy : 0.8\n",
      "At iteration 6100\n",
      "Training loss : 0.48372387886047363\n",
      "Training accuracy : 0.7807\n",
      "Validation loss : 0.4541197419166565\n",
      "Validation accuracy : 0.8\n",
      "At iteration 6200\n",
      "Training loss : 0.48225077986717224\n",
      "Training accuracy : 0.7806\n",
      "Validation loss : 0.45233890414237976\n",
      "Validation accuracy : 0.794\n",
      "At iteration 6300\n",
      "Training loss : 0.480867475271225\n",
      "Training accuracy : 0.7806\n",
      "Validation loss : 0.45066410303115845\n",
      "Validation accuracy : 0.794\n",
      "At iteration 6400\n",
      "Training loss : 0.4795684218406677\n",
      "Training accuracy : 0.78\n",
      "Validation loss : 0.44909292459487915\n",
      "Validation accuracy : 0.792\n",
      "At iteration 6500\n",
      "Training loss : 0.4783444404602051\n",
      "Training accuracy : 0.7798\n",
      "Validation loss : 0.4476205110549927\n",
      "Validation accuracy : 0.794\n",
      "At iteration 6600\n",
      "Training loss : 0.47719600796699524\n",
      "Training accuracy : 0.78\n",
      "Validation loss : 0.4461947977542877\n",
      "Validation accuracy : 0.796\n",
      "At iteration 6700\n",
      "Training loss : 0.47610899806022644\n",
      "Training accuracy : 0.7803\n",
      "Validation loss : 0.44481924176216125\n",
      "Validation accuracy : 0.796\n",
      "At iteration 6800\n",
      "Training loss : 0.47508686780929565\n",
      "Training accuracy : 0.7799\n",
      "Validation loss : 0.44351935386657715\n",
      "Validation accuracy : 0.796\n",
      "At iteration 6900\n",
      "Training loss : 0.47413086891174316\n",
      "Training accuracy : 0.7801\n",
      "Validation loss : 0.4422985017299652\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7000\n",
      "Training loss : 0.4732283651828766\n",
      "Training accuracy : 0.7803\n",
      "Validation loss : 0.4411262571811676\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7100\n",
      "Training loss : 0.4723643660545349\n",
      "Training accuracy : 0.7801\n",
      "Validation loss : 0.4400206208229065\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7200\n",
      "Training loss : 0.4715494215488434\n",
      "Training accuracy : 0.7802\n",
      "Validation loss : 0.4390149414539337\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7300\n",
      "Training loss : 0.4707813560962677\n",
      "Training accuracy : 0.7802\n",
      "Validation loss : 0.4380559027194977\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7400\n",
      "Training loss : 0.47004804015159607\n",
      "Training accuracy : 0.7802\n",
      "Validation loss : 0.4371326267719269\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7500\n",
      "Training loss : 0.469359815120697\n",
      "Training accuracy : 0.7802\n",
      "Validation loss : 0.43621471524238586\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7600\n",
      "Training loss : 0.4686999022960663\n",
      "Training accuracy : 0.7801\n",
      "Validation loss : 0.43532970547676086\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7700\n",
      "Training loss : 0.46808359026908875\n",
      "Training accuracy : 0.7802\n",
      "Validation loss : 0.4344967007637024\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7800\n",
      "Training loss : 0.46748921275138855\n",
      "Training accuracy : 0.7807\n",
      "Validation loss : 0.43370360136032104\n",
      "Validation accuracy : 0.794\n",
      "At iteration 7900\n",
      "Training loss : 0.4669416546821594\n",
      "Training accuracy : 0.7807\n",
      "Validation loss : 0.4329542815685272\n",
      "Validation accuracy : 0.794\n",
      "At iteration 8000\n",
      "Training loss : 0.46640971302986145\n",
      "Training accuracy : 0.7802\n",
      "Validation loss : 0.432233989238739\n",
      "Validation accuracy : 0.794\n",
      "At iteration 8100\n",
      "Training loss : 0.4659174382686615\n",
      "Training accuracy : 0.7799\n",
      "Validation loss : 0.43154269456863403\n",
      "Validation accuracy : 0.794\n",
      "At iteration 8200\n",
      "Training loss : 0.4654427170753479\n",
      "Training accuracy : 0.7796\n",
      "Validation loss : 0.4308845102787018\n",
      "Validation accuracy : 0.794\n",
      "At iteration 8300\n",
      "Training loss : 0.46500054001808167\n",
      "Training accuracy : 0.7797\n",
      "Validation loss : 0.4302726089954376\n",
      "Validation accuracy : 0.794\n",
      "At iteration 8400\n",
      "Training loss : 0.4645845592021942\n",
      "Training accuracy : 0.78\n",
      "Validation loss : 0.4296933710575104\n",
      "Validation accuracy : 0.796\n",
      "At iteration 8500\n",
      "Training loss : 0.464191198348999\n",
      "Training accuracy : 0.78\n",
      "Validation loss : 0.42913827300071716\n",
      "Validation accuracy : 0.796\n",
      "At iteration 8600\n",
      "Training loss : 0.4638158679008484\n",
      "Training accuracy : 0.78\n",
      "Validation loss : 0.4286094009876251\n",
      "Validation accuracy : 0.798\n",
      "At iteration 8700\n",
      "Training loss : 0.4634481370449066\n",
      "Training accuracy : 0.7803\n",
      "Validation loss : 0.42802944779396057\n",
      "Validation accuracy : 0.798\n",
      "At iteration 8800\n",
      "Training loss : 0.4631005823612213\n",
      "Training accuracy : 0.7804\n",
      "Validation loss : 0.42749351263046265\n",
      "Validation accuracy : 0.798\n",
      "At iteration 8900\n",
      "Training loss : 0.4627673923969269\n",
      "Training accuracy : 0.7801\n",
      "Validation loss : 0.4269953966140747\n",
      "Validation accuracy : 0.798\n",
      "At iteration 9000\n",
      "Training loss : 0.46245747804641724\n",
      "Training accuracy : 0.7801\n",
      "Validation loss : 0.4265470802783966\n",
      "Validation accuracy : 0.796\n",
      "At iteration 9100\n",
      "Training loss : 0.462160587310791\n",
      "Training accuracy : 0.7797\n",
      "Validation loss : 0.42613694071769714\n",
      "Validation accuracy : 0.796\n",
      "At iteration 9200\n",
      "Training loss : 0.4618741273880005\n",
      "Training accuracy : 0.7797\n",
      "Validation loss : 0.42571601271629333\n",
      "Validation accuracy : 0.796\n",
      "At iteration 9300\n",
      "Training loss : 0.46160462498664856\n",
      "Training accuracy : 0.7795\n",
      "Validation loss : 0.42530855536460876\n",
      "Validation accuracy : 0.796\n",
      "At iteration 9400\n",
      "Training loss : 0.46134623885154724\n",
      "Training accuracy : 0.7794\n",
      "Validation loss : 0.4249406158924103\n",
      "Validation accuracy : 0.796\n",
      "At iteration 9500\n",
      "Training loss : 0.4611024558544159\n",
      "Training accuracy : 0.7793\n",
      "Validation loss : 0.42460206151008606\n",
      "Validation accuracy : 0.796\n",
      "At iteration 9600\n",
      "Training loss : 0.4608648419380188\n",
      "Training accuracy : 0.7792\n",
      "Validation loss : 0.4242822825908661\n",
      "Validation accuracy : 0.798\n",
      "At iteration 9700\n",
      "Training loss : 0.46063899993896484\n",
      "Training accuracy : 0.779\n",
      "Validation loss : 0.4239463806152344\n",
      "Validation accuracy : 0.798\n",
      "At iteration 9800\n",
      "Training loss : 0.4604160785675049\n",
      "Training accuracy : 0.779\n",
      "Validation loss : 0.42363402247428894\n",
      "Validation accuracy : 0.8\n",
      "At iteration 9900\n",
      "Training loss : 0.4602038562297821\n",
      "Training accuracy : 0.7791\n",
      "Validation loss : 0.4233642518520355\n",
      "Validation accuracy : 0.8\n"
     ]
    }
   ],
   "source": [
    "model3 = generate_single_hidden_MLP(2) \n",
    "training_routine(model3,dataset,10000,gpu)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print_model(model3,testx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (dl)",
   "language": "python",
   "name": "dl"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
